<?php

class Registry
{
    // 保存实例对象
    private static $objs = [];
    // get获取实例对象
    public static function get(string $alias): Object
    {
        if (!isset(self::$objs[$alias])) {
            throw new \Exception($alias . 'not found');
        }
        return self::$objs[$alias];
    }
    // set将实例对象注册到属性$objs中
    public static function set(string $alias, Object $obj): void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    // 注销实例
    public static function unset(string $alias): void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

class DbFactory
{
    const ALIAS = 'Db';
    public static function create()
    {
        $db = Registry::get(self::ALIAS);
        if (!$db) {
            $db = new Db([
                'host' => 'localhost',
                'user' => 'root',
                'pass' => 'root',
                'db_name' => 'test'
            ]);
            Registry::set(self::ALIAS, $db);
        }
        return $db;
    }
}


//当我们需要Db实例时，只要去调用DbFactory::create即可，该方法保证了单例。下面是测试代码：
$db = DbFactory::create();
var_dump($db);
